/////////////////////////////////////////////////////////////////////////////
// SystemTray.h : header file
//
// Written by Chris Maunder (chrismaunder@codeguru.com)
// Copyright (c) 1998.
//
// This code may be used in compiled form in any way you desire. This
// file may be redistributed unmodified by any means PROVIDING it is 
// not sold for profit without the authors written consent, and 
// providing that this notice and the authors name is included. If 
// the source code in  this file is used in any commercial application 
// then acknowledgement must be made to the author of this file 
// (in whatever form you wish).
//
// This file is provided "as is" with no expressed or implied warranty.
// The author accepts no liability if it causes any damage to your
// computer, causes your pet cat to fall ill, increases baldness or
// makes you car start emitting strange noises when you start it up.
//
// Expect bugs.
// 
// Please use and enjoy. Please let me know of any bugs/mods/improvements 
// that you have found/implemented and I will fix/incorporate them into this
// file. 

#ifndef _INCLUDED_SYSTEMTRAY_H_
#define _INCLUDED_SYSTEMTRAY_H_

#include <afxtempl.h>

/////////////////////////////////////////////////////////////////////////////
// CSystemTray window
//#define WM_ICON_NOTIFY (WM_USER + 0x111)
#define WM_ICON_NOTIFY (WM_USER + 0x111)
class CSystemTray : public CWnd
{
	// Construction/destruction
public:
	CSystemTray();
	CSystemTray(CWnd* pWnd, UINT uCallbackMessage, LPCTSTR szTip, HICON icon, UINT uID);
	virtual ~CSystemTray();

	DECLARE_DYNAMIC(CSystemTray)

	// Operations
public:
	BOOL Enabled() { return m_bEnabled; }
	BOOL Visible() { return !m_bHidden; }

	// Create the tray icon
	BOOL Create(CWnd* pParent, UINT uCallbackMessage, LPCTSTR szTip, HICON icon, UINT uID);

	// Change or retrieve the Tooltip text
	BOOL    SetTooltipText(LPCTSTR pszTooltipText);
	BOOL    SetTooltipText(UINT nID);
	CString GetTooltipText() const;

	// Change or retrieve the icon displayed
	BOOL  SetIcon(HICON hIcon);
	BOOL  SetIcon(LPCTSTR lpszIconName);
	BOOL  SetIcon(UINT nIDResource);
	BOOL  SetStandardIcon(LPCTSTR lpIconName);
	BOOL  SetStandardIcon(UINT nIDResource);
	HICON GetIcon() const;
	void  HideIcon();
	void  ShowIcon();
	void  RemoveIcon();
	void  MoveToRight();

	// For icon animation
	BOOL  SetIconList(UINT uFirstIconID, UINT uLastIconID); 
	BOOL  SetIconList(HICON* pHIconList, UINT nNumIcons); 
	BOOL  IsAnimating(){return m_uIDTimer!=0;};
	BOOL  Animate(UINT nDelayMilliSeconds, int nNumSeconds = -1);
	BOOL  StepAnimation();
	BOOL  StopAnimation();

	// Change menu default item
	void GetMenuDefaultItem(UINT& uItem, BOOL& bByPos);
	BOOL SetMenuDefaultItem(UINT uItem, BOOL bByPos);

	// Change or retrieve the window to send notification messages to
	BOOL  SetNotificationWnd(CWnd* pNotifyWnd);
	CWnd* GetNotificationWnd() const;

	// Default handler for tray notification message
	virtual LRESULT OnTrayNotification(WPARAM uID, LPARAM lEvent);

	// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CSystemTray)
protected:
	virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
	//}}AFX_VIRTUAL

	// Implementation
protected:
	void Initialise();

	BOOL            m_bEnabled;   // does O/S support tray icon?
	BOOL            m_bHidden;    // Has the icon been hidden?
	NOTIFYICONDATA  m_tnd;

	CArray<HICON, HICON> m_IconList;
	static UINT  m_nIDEvent;
	UINT         m_uIDTimer;
	int          m_nCurrentIcon;
	COleDateTime m_StartTime;
	int          m_nAnimationPeriod;
	HICON        m_hSavedIcon;
	UINT         m_DefaultMenuItemID;
	BOOL         m_DefaultMenuItemByPos;

	// Generated message map functions
protected:
	//{{AFX_MSG(CSystemTray)
	afx_msg void OnTimer(UINT nIDEvent);
	//}}AFX_MSG

	DECLARE_MESSAGE_MAP()
};


#endif

/////////////////////////////////////////////////////////////////////////////
